import services from './service';
import _ from 'lodash';
import { Model, ItemUtils, unitsPrice } from '@/utils'
import { base } from '@/config';
import { message } from 'antd'
import {TabEnum,GlobalInitEnum} from './config/enum'
import pageConfig from './config/pageConfig';
const { namespace, listenRouter } = pageConfig;
const initState = {
  // 整体控制变量
  globalData: {}, // 保存 title和value 页面根据该参数展示选中的整体变量
  globalEnum:[], // 整体控制变量的枚举-一般由后端返回 前端设计弹框或者其他进行选择
  // tab数据
  tabsKey: '',
  tabsList: [],
  isEnumLoading:true,
}

export default Model.extend({
  namespace: namespace,
  state: _.cloneDeep(initState),
  subscriptions: {
    setup({ dispatch, listen }: any) {
      listen(listenRouter, () => {
        dispatch({
          type: 'updateState',
          payload: {
            ..._.cloneDeep(initState),
            isEnumLoading:true,
          }
        })
        // 优先初始化tabs的枚举数据!!!
        // 初始化tabs数据
        dispatch({ type: 'fetchUpdateTabs' });
        // 初始化全局控制变量
        dispatch({ type: 'fetchGlobalEnum' });
      });
    }
  },
  effects: {
    // 获取全局控制变量的枚举
    * fetchGlobalEnum({ payload, callback }: any, { select, update, callWithConfirmLoading, put }: any) {
      const data = GlobalInitEnum; // 这里暂时用静态数据代替
      // 更新
      yield update({
        globalEnum: data
      })
      // 默认选中第一个枚举 并进行对应tabs数据获取
      yield put({
        type: 'fetchUpdateGlobalData',
        payload: {
          globalData: data[0]
        }
      })
    },
    // 全局控制变量切换时 重置tabskey并进行对应tabs请求
    // 该方法不可在初始化时调用
    * fetchUpdateGlobalData({ payload, callback }: any, { select,update, callWithConfirmLoading, put }: any) {
      const { globalData } = payload
      console.assert(globalData,'需要修改的全局控制变量不存在,请排查');
      const {
        tabsList
      } = yield select((_: any) => _[namespace]);
      // 更新选择的整体控制变量,并重置tabskey
      yield update({
        globalData,
        tabsKey:tabsList[0]?.value,
        isEnumLoading:false
      })
      // 默认进行对应tabsKey数据请求
      yield put({
        type: 'fetchChildData',
        payload: {
          tabsKey:tabsList[0]?.value
        }
      })
      // 如果存在回调
      if (callback) {
        callback()
      }
    },
    // 动态更新tab页 支持静态替换-初始化用
    // 默认数据调用放在全局控制枚举请求中
    * fetchUpdateTabs({ payload, callback }: any, { update,callWithConfirmLoading, put }: any) {
        let tabs = TabEnum
        yield update({
          tabsList: tabs,
          tabsKey:tabs[0]?.value
        })
    },
    // 刷新tabsKey对应的数据 用于重置状态后调用
    * fetchResetTabsData({ payload, callback }: any, { select,update, callWithConfirmLoading, put }: any) {
        const {
          tabsKey
        } = yield select((_: any) => _[namespace]);
        yield put({
          type: 'fetchChildData',
          payload: {
            tabsKey
          }
        })
    },
    // 该方法提供给页面内部调用
    // 动态切换点击的tabs数据并根据选择tabs进行对应models进行调用
    * fetchUpdateTabsToList({ payload, callback }: any, { select,update, callWithConfirmLoading, put }: any) {
      const { tabsKey } = payload
      const {
        tabsKey:oldTabsKey
      } = yield select((_: any) => _[namespace]);
      // 如果页面重复点击tabs 不做响应
      if (tabsKey === oldTabsKey) {
        return 
      }
      // 替换对应key
      yield update({
        tabsKey
      })
      yield put({
        type: 'fetchChildData',
        payload: {
          tabsKey
        }
      })
      // 如果存在回调
      if (callback) {
        callback()
      }
    },
    // 根据对应的tabsKey找到对应model方法进行数据请求
    *fetchChildData({ payload, callback }: any, { update, callWithConfirmLoading, put }: any) {
      const { tabsKey } = payload
      console.assert(tabsKey, '未接收到传入tabsKey,请排查');
      console.log('啦啦啦',tabsKey);
      // 查询到对应key的对应models层方法
      // 如果是动态tabs 需要和后端协调指定key
      switch (tabsKey) {
        case '1': // 
          break;
        case '2':
          break;
        case '3':
          break;
        case '4':
            break;
        default:
          console.error('存在未匹配tabsKey');
          break;
      }
    },
  },
  reducers: {

  }
})
